<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>迭代器自定义</title>
</head>

<body>
<!-- 
  迭代器
  特点：
    1.for ... of循环, Iterator接口主要对接
    2.原生具备Iterator的数据（for of遍历）
      Array
      Arguments
      Set
      Map
      String
      TypedArray
      NodeList
    3.工作原理
      a.创建一个指针对象，指向当前数据结构的起始位置
      b.第一次调用对象的next方法，指针自动指向数据结构的第一个成员
      c.接下来不断调用next方法，指针一直往后移动，直到指向最后一个成员
      d.每调用一次都会返回一个含有value和done属性的对象（迭代结束，done属性的值将会是true,value是undefined）
-->
</body>

<script>
  // 自定义迭代器
  function createIterator(items) {
    var index = 0;
    return {
      next() {
        var done = index >= items.length;
        return {value: items[index++], done: done}
      }
    }
  }

  var iterator = createIterator(["a", "b"])
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());

  // 创建可迭代对象
  var iterable = {
    items: ["a", "b"],
    index: 0,
    [Symbol.iterator]() {
      return this
    },
    next() {
      var done = this.index >= this.items.length
      return {value: this.items[this.index++], done: done}
    },
    return() {
      return {value: undefined, done: true}
    }
  }

  for(var value of iterable) {
    console.log(value)
    // throw new Error()  // 可以用抛出错误
  }

</script>

</html>